001 /*
002 * Copyright 2004 Stephen J. McConnell.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
013 * implied.
014 *
015 * See the License for the specific language governing permissions and
016 * limitations under the License.
017 */
018
019 package net.dpml.metro.data;
020
021 import java.io.Serializable;
022
023 import net.dpml.metro.info.Priority;
024
025 /**
026 * A logging category descriptor hierachy. The descriptor contains a category name, a
027 * optional priority value, and an optional target. If the priority or target values
028 * null, the resulting value will be derived from the parent category desciptor. A
029 * category descriptor may 0-n subsidiary categories. CategoryDirective names are relative.
030 * For example, the category "orb" will appear as "my-app.orb" if the parent category
031 * name is "my-app".
032 *
033 * <p><b>XML</b></p>
034 * <pre>
035 * <categories priority="<font color="darkred">INFO</font>">
036 * <category priority="<font color="darkred">DEBUG</font>" name="<font color="darkred">loader</font>" />
037 * <category priority="<font color="darkred">WARN</font>" name="<font color="darkred">types</font>" />
038 * <category priority="<font color="darkred">ERROR</font>" name="<font color="darkred">types.builder</font>" target="<font color="darkred">default</font>"/>
039 * <category name="<font color="darkred">profiles</font>" />
040 * <category name="<font color="darkred">lifecycle</font>" />
041 * <category name="<font color="darkred">verifier</font>" />
042 * </categories>
043 * </pre>
044 *
045 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a>
046 * @version 1.0.0
047 */
048 public class CategoryDirective extends AbstractDirective implements Serializable
049 {
050 /**
051 * Serial version identifier.
052 */
053 static final long serialVersionUID = 1L;
054
055 /**
056 * The logging category name.
057 */
058 private final String m_name;
059
060 /**
061 * The default logging priority.
062 */
063 private final Priority m_priority;
064
065 /**
066 * The default logging target.
067 */
068 private final String m_target;
069
070 /**
071 * Creation of a new CategoryDirective using a supplied name.
072 *
073 * @param name the category name
074 */
075 public CategoryDirective( final String name )
076 {
077 this( name, null, null );
078 }
079
080 /**
081 * Creation of a new CategoryDirective using a supplied name and priority.
082 *
083 * @param name the category name
084 * @param priority the category priority - DEBUG, INFO, WARN, or ERROR
085 */
086 public CategoryDirective( final String name, Priority priority )
087 {
088 this( name, priority, null );
089 }
090
091 /**
092 * Creation of a new CategoryDirective using a supplied name, priority, target and
093 * collection of subsidiary categories.
094 *
095 * @param name the category name
096 * @param priority the category priority - DEBUG, INFO, WARN, or ERROR
097 * @param target the name of a logging category target
098 *
099 */
100 public CategoryDirective(
101 final String name, final Priority priority, final String target )
102 {
103 m_name = name;
104 m_target = target;
105 m_priority = priority;
106 }
107
108 /**
109 * Return the category name.
110 *
111 * @return the category name
112 */
113 public String getName()
114 {
115 return m_name;
116 }
117
118 /**
119 * Return the logging priority for the category.
120 *
121 * @return the logging priority for the category
122 */
123 public Priority getPriority()
124 {
125 return m_priority;
126 }
127
128 /**
129 * Return the default log target for the category.
130 *
131 * @return the default target name
132 */
133 public String getTarget()
134 {
135 return m_target;
136 }
137
138 /**
139 * Test this object for equality with the supplied object.
140 * @param other the other object
141 * @return true if the objects are equal
142 */
143 public boolean equals( Object other )
144 {
145 if( null == other )
146 {
147 return false;
148 }
149
150 if( !( other instanceof CategoryDirective ) )
151 {
152 return false;
153 }
154
155 CategoryDirective test = (CategoryDirective) other;
156 if( !equals( m_name, test.m_name ) )
157 {
158 return false;
159 }
160 else if( !equals( m_priority, test.m_priority ) )
161 {
162 return false;
163 }
164 else
165 {
166 return equals( m_target, test.m_target );
167 }
168 }
169
170 /**
171 * Return the instance hash code value.
172 * @return the hash value
173 */
174 public int hashCode()
175 {
176 int hash = super.hashCode();
177 hash ^= hashValue( m_name );
178 hash ^= hashValue( m_priority );
179 hash ^= hashValue( m_target );
180 return hash;
181 }
182 }